package com.boom.springapp.javafxdemo.utils;

import java.io.*;
import java.util.*;

/**
 * @author hhl
 * @version 1.0
 * @description CSV 差异比较工具类
 * @date 2025/12/7 9:55
 */
public class CsvDiffUtil {

    /**
     * 比较两个 CSV 文件中基于 rpid 的差异行
     * 返回：第一个文件中有但第二个文件中没有的行，以及第二个文件中有但第一个文件中没有的行
     *
     * @param file1 第一个 CSV 文件路径
     * @param file2 第二个 CSV 文件路径
     * @return Map 包含两个集合：missingInFile1 和 missingInFile2
     */
    public static Map<String, List<Map<String, String>>> compareCsvByRpid(String file1, String file2) {
        Map<String, List<Map<String, String>>> result = new HashMap<>();
        result.put("missingInFile1", new ArrayList<>());
        result.put("missingInFile2", new ArrayList<>());

        // 读取第一个文件的所有行，以 rpid 为 key
        Map<String, Map<String, String>> map1 = readCsvToMap(file1);
        // 读取第二个文件的所有行，以 rpid 为 key
        Map<String, Map<String, String>> map2 = readCsvToMap(file2);

        // 找出 file1 中有但 file2 中没有的行
        for (Map.Entry<String, Map<String, String>> entry : map1.entrySet()) {
            if (!map2.containsKey(entry.getKey())) {
                result.get("missingInFile1").add(entry.getValue());
            }
        }

        // 找出 file2 中有但 file1 中没有的行
        for (Map.Entry<String, Map<String, String>> entry : map2.entrySet()) {
            if (!map1.containsKey(entry.getKey())) {
                result.get("missingInFile2").add(entry.getValue());
            }
        }

        return result;
    }

    /**
     * 将 CSV 文件读取为以 rpid 为 key 的 Map 结构
     *
     * @param filePath CSV 文件路径
     * @return Map<String, Map < String, String>>，key 是 rpid，value 是该行的字段映射
     */
    private static Map<String, Map<String, String>> readCsvToMap(String filePath) {
        Map<String, Map<String, String>> result = new HashMap<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            boolean isFirstLine = true;
            List<String> headers = new ArrayList<>();

            while ((line = br.readLine()) != null) {
                String[] values = line.split(",");
                if (isFirstLine) {
                    // 读取表头
                    headers.addAll(Arrays.asList(values));
                    isFirstLine = false;
                    continue;
                }

                // 构建当前行的字段映射
                Map<String, String> row = new HashMap<>();
                for (int i = 0; i < values.length && i < headers.size(); i++) {
                    row.put(headers.get(i), values[i].trim());
                }

                // 使用 rpid 作为 key
                String rpid = row.get("rpid");
                if (rpid != null && !rpid.isEmpty()) {
                    result.put(rpid, row);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException("读取 CSV 文件失败: " + filePath, e);
        }
        return result;
    }

    public static void main(String[] args) {
        String file1 = "E:\\临时\\BV1QRSTBaEiU_愚人法，一切皆有可能【神棍老师的日常1646】\\BV1QRSTBaEiU.csv";
        String file2 = "E:\\PycharmProjects\\bilibili-comment-analyzer\\output\\BV1QRSTBaEiU_愚人法，一切皆有可能【神棍老师的日常1646】\\BV1QRSTBaEiU.csv";

        Map<String, List<Map<String, String>>> diff = CsvDiffUtil.compareCsvByRpid(file1, file2);

        System.out.println("file1 中有但 file2 中没有的行:");
        diff.get("missingInFile1").forEach(row -> System.out.println(row));

        System.out.println("\nfile2 中有但 file1 中没有的行:");
        diff.get("missingInFile2").forEach(row -> System.out.println(row));
    }

}
